package ar.edu.utn.frsf.tpae.a2013.g04.service;

import java.util.Date;
import java.util.List;

import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.Gasto;
import ar.edu.utn.frsf.tpae.a2013.g04.persistence.model.SolicitudGasto;

public interface SolicitudGastoService {
	
	/**
	 * Crea una nueva solicitud de Gasto en estado 
	 * <code>SolicitudGasto.PENDIENTE</code>.
	 * 
	 * @param centro
	 *            Centro de costo asociado a la solicitud.
	 * @param descripcion
	 *            Descripcion de la solicitud
	 * @param empleado
	 *            Empleado que genero la solicitud
	 * @param importe
	 *            Importe estimado de la solicitud
	 * @return La solicitud creada.
	 */
	SolicitudGasto nuevaSolicitudGasto(CentroCosto centro, String descripcion, Empleado empleado,Double importe);
	
	
	/**
	 * Busca todas las solicitudes asociadas a un empleado.
	 * 
	 * @param empleado
	 *            Empleado del cual seran las solicitudes.
	 * @return Una lista de solicitudes del empleado.
	 */
	List<SolicitudGasto> listarSolicitudesEmpleado(Empleado empleado);
	
	
	/**
	 * Agrega un gasto a una sollicitud aprobada.
	 * 
	 * @param sol
	 *            Solicitud a la cual se agrega el gasto.
	 * @param fecha
	 *            Fecha de facturacion de gasto
	 * @param nroFact
	 *            Numero de factura asociado al Gasto en cuestion
	 * @param imp
	 *            Importe de la factura asociada al Gasto. 
	 * @return El gasto creado
	 */
	Gasto agregarGasto(SolicitudGasto sol, Date fecha, String nroFact, Double imp );
	
	
	/**
	 * Busca todas las solicitudes en estado Pendiente en el sistema.
	 * 
	 * @return Una lista de solicitudes pendientes.
	 */
	List<SolicitudGasto> listarSolicitudPendientes();
	
	
	/**
	 * Busca todas las solicitudes asociadas pendientes de un empleado.
	 * 
	 * @param empleado
	 *            Empleado del cual seran las solicitudes.
	 * @return Una lista de solicitudes pendientes.
	 */
	List<SolicitudGasto> listarSolicitudPendientes(Empleado emp);
	
	
	/**
	 * Busca todas las solicitudes asociadas pendientes 
	 * asociadas a un centro de costo.
	 * 
	 * @param cco
	 *            Centro de Costo del cual seran las solicitudes.
	 * @return Una lista de solicitudes pendientes.
	 */
	List<SolicitudGasto> listarSolicitudPendientes(CentroCosto cco);
	
	
	/**
	 * Busca todas las solicitudes asociadas pendientes 
	 * asociadas a un centro de costo y un empleadp.
	 * 
	 * @param emp
	 *            Empleado del cual seran las solicitudes.
	 * @param cco
	 *            Centro de Costo del cual seran las solicitudes.
	 * @return Una lista de solicitudes pendientes.
	 */
	List<SolicitudGasto> listarSolicitudPendientes(Empleado emp,CentroCosto cco);
	
	
	/**
	 * Cambia el estado de una solicitud pendiente a aprobada.
	 * 
	 * @param sol
	 *            Solicitud que se aprobara.
	 * @param comentarios
	 *            Comentarios del supervisor sobre la aprobacion.
	 * @return La solicitud de gasto creada
	 */
	SolicitudGasto aprobarSolicitud(SolicitudGasto sol ,String comentarios);
	
	
	/**
	 * Cambia el estado de una solicitud pendiente a rechazada.
	 * 
	 * @param sol
	 *            Solicitud que se rechazada.
	 * @param comentarios
	 *            Comentarios del supervisor sobre el rechazo.
	 * @return La solicitud de gasto creada
	 */
	SolicitudGasto rechazarSolicitud(SolicitudGasto sol,String comentarios);
	
	List<Gasto> buscarGastos();
	List<Gasto> buscarGastos(Empleado emp,CentroCosto cco);
	List<Gasto> buscarGastos(CentroCosto cco);
	List<Gasto> buscarGastos(Empleado emp);

}
